/*
 * Copyright 2020 eBlocker Open Source UG (haftungsbeschraenkt)
 *
 * Licensed under the EUPL, Version 1.2 or - as soon they will be
 * approved by the European Commission - subsequent versions of the EUPL
 * (the "License"); You may not use this work except in compliance with
 * the License. You may obtain a copy of the License at:
 *
 *   https://joinup.ec.europa.eu/page/eupl-text-11-12
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
export default function AppRouter($stateProvider) {
    'ngInject';
    'use strict';

    /*
     * Splash screen
     */
    let appState = {
        'name': 'app',
        'url': '/{pageContextId}',
        'templateUrl': 'app/controlbar.html',
        'controller': 'ControlbarController',
        'controllerAs': 'ctrl'
    };

    /*
     * Main screen with resolved bootstrap dependencies
     */
    let mainState = {
        'name': 'app.main', // must be child of appState
        'templateUrl': 'app/main.html',
        'controller': 'MainController',
        'controllerAs': 'main',
        'resolve': {
            'security': 'security',
            'token': ['security', 'APP_CONTEXT', function(security, APP_CONTEXT) {
                return security.requestToken(APP_CONTEXT.name);
            }],
            'settings': 'settings',
            'locale': ['settings', function(settings) {
                return settings.load().catch(function error() {
                    return settings.locale();
                });
            }],
            'device': ['token', 'DeviceService', function(token, DeviceService) {
                // 'token' needed only indirectly for the REST call
                // required for UserService.getAllUsers(..)
                return DeviceService.getCurrentDevice().then(function success(response) {
                    return response.data;
                }, function error(response) {
                    return response;
                });
            }],
            'allUsers': ['token', 'UserService', 'device', function(token, UserService, device) {
                // 'token' needed only indirectly for the REST call
                // required to decide whether to show user entry or not (see main.controller.js)
                return UserService.initializeUserService(device);
            }],
            'consoleUrl': ['token', 'ConsoleService', function(token, ConsoleService) {
                // required to navigate to dashboard and console
                return ConsoleService.init();
            }],
            'productInfo': ['token', 'RegistrationService', function(token, RegistrationService) {
                // 'token' needed only indirectly for the REST call
                return RegistrationService.getProductInfo();
            }],
            'userProfile': ['device', function(device) {
                return device.effectiveUserProfile;
            }],
            'allMessages': ['token', 'MessageService', function(token, MessageService) {
                return MessageService.getMessages();
            }],
            'globalSslStatus': ['token', 'SslService', function(token, SslService) {
                return SslService.getSslStatus().then(function success(response) {
                    return response.data.globalSslStatus;
                }, function error() {
                    return false;
                });
            }]
        }
    };

    $stateProvider.state(mainState);
    $stateProvider.state(appState);
}
